#ifndef VISUALISATION_H
#define VISUALISATION_H
#include "ogreapplication.h"
#include "folder.h"
#include <iostream>

//espace horizontal
#define HOR_SPACE 3*SCALE
//espace vertical
#define VER_SPACE 8*SCALE
//grand espace horizontal (entre differents repertoires)
#define	HOR_INTERSPACE HOR_SPACE*2

using namespace std;
using namespace Ogre;

//déclaration anticipée pour résoudre le problème d'inclusion cyclique entre myapplication et visualisation
class MyApplication;

class Visualisation 
{

	private :
		MyApplication * myApp;
		SceneNode* racine;
		int decalage;
		bool construction_finie;

	//DEBUG
		string debug; 

    public :
		Visualisation();
		~Visualisation();
        void setApplication(MyApplication * m); 

		//fonction permettant d'afficher un message dans le panneau d'affichage
        void afficherMessage ( string s ); 

		//creer une ligne entre 2 entités
		void ligne(SceneNode* sceneN,Vector3 pos1, Vector3 pos2);

		//creation de la racine du fileSystem
		void creerRacine(string nom, string nomMesh, Vector3 echelle);

		//creer une entite rattache a la scene racine 
		void creerEntite(string nom, string nomMesh, Vector3 position);

		//creer la représentation d'un système de fichiers à partir de sa racine
		void creerRepresentationGraphique(char * nomOV);

		//repartir les elements horizontalement dans l'espace
		//on fournira uniquement des espacements impaires
		void repartirAbscisse(int profondeur, vector<Vector3> &vectPositions);

		//creer les liens avec les fils
		void creerLiensFils(Vector3 positionPere, vector<Vector3> &vectPositions);

		//positionner graphiquement les elements du systeme de fichiers
		Vector3 positionnerElements(Folder * f);

		//afficher les fils d'un dossier
		void afficherFils(Folder * dossierPere, Vector3 positionPere,vector<Vector3> &vectPositions);

		//affiche la partie gauche ou droite des fils
		void afficherPartieGaucheFils(Folder * dossierPere,vector<Vector3> &vectPositions);

		//affiche la partie gauche ou droite des fils
		void afficherPartieDroiteFils(Folder * dossierPere,vector<Vector3> &vectPositions);

		//getters
		SceneNode * getNoeud(String name);

		SceneNode * getRacine();

		int getDecalage();

		bool getConstructionFinie();

		//setters
		void setDecalage(int i);

};

#endif // VISUALISATION_H
